本方案可实现保存网络图片和 assets 中的图片到本地相册。
Flutter 保存图片到本地相册需要使用到 package:
image_gallery_saver 保存文件或图片到本地;cached_network_image 图片缓存管理;permission_handler 授权管理;用到的权限上述相关 package 均已给出。
实现方法:
/// 使用 File apiimport 'dart:io';/// 使用 Uint8List 数据类型import 'dart:typed_data';/// 使用 DefaultCacheManager 类(可能无法自动引入,需要手动引入)import 'package:flutter_cache_manager/flutter_cache_manager.dart';/// 授权管理import 'package:permission_handler/permission_handler.dart';/// 图片缓存管理import 'package:cached_network_image/cached_network_image.dart';/// 保存文件或图片到本地import 'package:image_gallery_saver/image_gallery_saver.dart';class AppUtil { /// 保存图片到相册 /// /// 默认为下载网络图片,如需下载资源图片,需要指定 [isAsset] 为 `true`。 static Future saveImage(String imageUrl, {bool isAsset: false}) async {try { if (imageUrl == null) throw '保存失败,图片不存在!'; /// 权限检测 PermissionStatus storageStatus = await Permission.storage.status; if (storageStatus != PermissionStatus.granted) {storageStatus = await Permission.storage.request();if (storageStatus != PermissionStatus.granted) { throw '无法存储图片,请先授权!';} } /// 保存的图片数据 Uint8List imageBytes; if (isAsset == true) {/// 保存资源图片ByteData bytes = await rootBundle.load(imageUrl);imageBytes = bytes.buffer.asUint8List(); } else {/// 保存网络图片CachedNetworkImage image = CachedNetworkImage(imageUrl: imageUrl);DefaultCacheManager manager = image.cacheManager ?? DefaultCacheManager();Map headers = image.httpHeaders;File file = await manager.getSingleFile( image.imageUrl, headers: headers,);imageBytes = await file.readAsBytes(); } /// 保存图片 final result = await ImageGallerySaver.saveImage(imageBytes); if (result == null || result == '') throw '图片保存失败'; print("保存成功");} catch (e) { print(e.toString());} }}用法如下:
AppUtil.saveImage('https://upload-images.jianshu.io/upload_images/795923-c5bcd041afcdfc23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'); 下载网络图片AppUtil.saveImage('assets/images/wechat_code.png', isAsset: true); 下载资源图片